package com.cn.date.date;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.Locale;

/**
 * SimpleDateFormat 是 Java 中用于格式化和解析日期的类，位于 java.text 包中。它可以将 Date 对象格式化为字符串，或者将字符串解析为 Date 对象。
 * 1. 构造方法
 * SimpleDateFormat(String pattern)：
 * 使用指定的日期和时间模式创建一个 SimpleDateFormat 对象。
 *
 * 	SimpleDateFormat(String pattern, Locale locale)：
 * 使用模式和区域设置（Locale）创建格式化对象，适用于多语言支持。
 *
 * 2. 常用方法
 * 2.1 String format(Date date): 将 Date 对象格式化为字符串。
 * 2.2 Date parse(String source): 将字符串解析为 Date 对象。字符串格式必须与定义的模式一致，否则会抛出 ParseException。
 *
 * 3. 常见的日期格式模式
 * y	年	2024 或 24
 * M	月	11 或 Nov
 * d	日	21
 * H	小时（24小时制）	00 到 23
 * h	小时（12小时制）	01 到 12
 * m	分	00 到 59
 * s	秒	00 到 59
 * S	毫秒	0 到 999
 * E	星期	Thu 或 Thursday
 * a	上/下午	AM 或 PM
 * z	时区	GMT+8 或 CST
 *
 * GMT	        Greenwich Mean Time	+0	全球通用
 * GMT+8	    Greenwich Mean Time +8	+8	中国、新加坡、马来西亚等
 * CST (China)	China Standard Time	+8	中国、香港、澳门、台湾
 * CST (US)	    Central Standard Time	-6	美国中部（例如芝加哥）
 *
 * 3.1 E 的规则：表示星期
 *             •	E：表示星期（Day of the Week）。
 *             •	根据 E 的个数，输出的详细程度不同：
 *             •	1-3 个 E：缩写形式。例如，Mon、Tue、Wed。
 *             •	4 个 E：完整形式。例如，Monday、Tuesday、Wednesday。
 *
 * 3.2 M 的规则：表示月份
 *             •	M：表示月份（Month）。
 *             •	根据 M 的个数，输出的详细程度不同：
 *             •	1 个 M：数字形式，1 位或 2 位。例如，1、11。
 *             •	2 个 M：数字形式，始终为 2 位。例如，01、11。
 *             •	3 个 M：缩写形式。例如，Jan、Feb、Mar。
 *             •	4 个 M：完整形式。例如，January、February、March
 *
 *
 * 4. SimpleDateFormat 是线程不安全的。如果在多线程环境中使用，可能会导致数据竞争问题
 * 解决方法：
 * 	•	局部变量：每个线程单独创建 SimpleDateFormat 实例。
 * 	•	使用 ThreadLocal：为每个线程提供独立的 SimpleDateFormat 实例。
 */
public class Date_07_SimpleDateFormat {
    public static void main(String[] args) {
        //1. SimpleDateFormat(String pattern): 使用指定的日期和时间模式创建一个 SimpleDateFormat 对象。
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

        //2. SimpleDateFormat(String pattern, Locale locale): 使用模式和区域设置（Locale）创建格式化对象，适用于多语言支持。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US);

        //3. 日期格式化-将Date格式化为字符串
        Date now = new Date();
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = simpleDateFormat1.format(now);
        System.out.println("格式化后的日期："+formattedDate);

        //4.日期解析-将字符串解析为Date对象
        String dateString = "2024-11-21 12:00:00";
        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parsedDate = null;
        try {
            parsedDate = simpleDateFormat2.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        System.out.println("解析后的日期："+parsedDate);

        //5. 常见的日期格式
        SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a z E");
        System.out.println(simpleDateFormat3.format(new Date())); //2024-11-21 14:20:01 下午 CST 周四

        //6. 星期如何设置为英文
        //当使用 SimpleDateFormat 格式化日期时，输出的内容如 周四 是因为你的程序运行环境的 默认语言环境（Locale） 设置为 中文（China）。
        // SimpleDateFormat 默认会根据当前环境的语言区域设置来格式化日期
        //如果 Locale 是 Locale.CHINA，星期会显示为 周一, 周二, 周三 等中文。
        //如果 Locale 是 Locale.US，星期会显示为 Monday, Tuesday, Wednesday 等英文。
        //如果希望输出为英文星期，可以在创建 SimpleDateFormat 对象时显式指定 Locale
        Date now3 = new Date();
        SimpleDateFormat simpleDateFormat4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a z E", Locale.US);
        String formatted = simpleDateFormat4.format(now3);
        System.out.println("格式化后的日期: "+formatted);

        //7 多语言支持-使用不同的Locale
        /*
        1. E 的规则：表示星期
            •	E：表示星期（Day of the Week）。
            •	根据 E 的个数，输出的详细程度不同：
            •	1-3 个 E：缩写形式。例如，Mon、Tue、Wed。
            •	4 个 E：完整形式。例如，Monday、Tuesday、Wednesday。

		  2. M 的规则：表示月份
            •	M：表示月份（Month）。
            •	根据 M 的个数，输出的详细程度不同：
            •	1 个 M：数字形式，1 位或 2 位。例如，1、11。
            •	2 个 M：数字形式，始终为 2 位。例如，01、11。
            •	3 个 M：缩写形式。例如，Jan、Feb、Mar。
            •	4 个 M：完整形式。例如，January、February、March
         */
        System.out.println("多语言支持-使用不同的Locale");
        Date now4 = new Date();
        SimpleDateFormat sdf1 = new SimpleDateFormat("EEEE, MMMM dd, yyyy", Locale.US);
        System.out.println("美国格式: " + sdf1.format(now4));

        sdf1 = new SimpleDateFormat("EEEE, MMMM dd, yyyy", Locale.FRANCE);
        System.out.println("法国格式: " + sdf1.format(now4));




    }
}
